====== LESS CSS Support in DokuWiki ======
This is available since release 2013-12-08 "[[:old_changes#release_2013-12-08_binky|Binky]]".
LESS is a dynamic stylesheet language that compiles to CSS. It offers new mechanisms like variables, nesting, mixins, operators and functions when writing stylesheets.
DokuWiki's [[CSS]] dispatcher includes a PHP-based LESS parser which means you can use the full advantage of this dynamic CSS preprocessing in your [[template]] and [[plugin]] styles. Of course this is completely optional you can also write plain old CSS.
LESS statements are parsed in ''.css'' and in ''.less'' files.
===== LESS Language Constructs =====
Please refer to the official [[https://github.com/MarcusSchwarz/lesserphp/blob/master/docs/docs.md|lesserphp documentation]](([[https://lesscss.org/#docs|lesscss.org documentation]] is **not** the right manual for DokuWiki )) to learn about the language itself. We're using [[https://github.com/MarcusSchwarz/lesserphp|lesserphp]] as a parser so any restrictions of that library apply (eg. you can't use JavaScript expressions).
===== Style Guide =====
When using LESS please keep the following things in mind:
* **Use nesting sparsely**. Nesting deeper that 3 or 4 levels usually isn't needed and does not improve readability and might even affect selector performance
* **Prefix your mixins and variables**. When you define your own mixins and variables try to avoid common names that might clash with other templates or plugins. Just as you would with your classes and IDs.
===== Accessing style.ini placeholders =====
[[style.ini]] placeholders are available in your styles as LESS variables, prefixed with ''%%@ini_%%'' and with the ''%%__%%'' removed.
E.g. the ''%%__background__%%'' placeholder becomes ''%%@ini_background%%'' in your LESS styles.
===== Version of lesserphp =====
At the moment (current date: 2021-12-30) the newest version of lesserphp is 0.5.5, which is included in DokuWiki "[[:changes#release_2020-07-29a_hogfather|Hogfather]]". Although the publication date of version 0.5.5 is March 10 2021 ([[https://leafo.net/lessphp/changelog.html|Changelog]]) there has been only mostly PHP compatibility changes since 2016. That means some features of the current less.js (which is the primary less-compiler) are not supported by this version.
Nevertheless you can achieve advanced technics, but less convenient. As shown in the following realization of an "IF-Statement", which is capable to include or exclude several CSS-rules at once.
===== How to realize an “IF-Statement”? =====
This LESS-code:
@my-option: false;
.my-optional-style() when (@my-option = false) {
#main_body { background-color: red; }
p { color: green; }
}
.my-optional-style() when (@my-option = true) {
#main_body { background-color: green; }
p { color: black; }
}
.my-optional-style();
compiles to this CSS-code:
#main_body {
background-color: red;
}
p {
color: green;
}
===== Insert Unparsed Code =====
* A trick to insert (nearly) every unparsed code in LESSPHP: [[issue>2254#issuecomment-386814503|Github/dokuwiki/issues#2254 (comment)]]
* And if you use an import of a css file [[https://github.com/dokuwiki/dokuwiki/issues/3735#issuecomment-1207289682|it is not processed as LESS]].
FIXME Add code example here
===== Caveats =====
Because all CSS has to pass through the LESS parser, we're a bit more strict on valid CSS. If your plugin uses invalid CSS it will likely throw an error now. A list of currently known problems is available at [[devel:less-errors|Less CSS Errors]].